#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 5e4 + 5, M = N;

int h[N], e[N], ne[N], idx;
int n;
bool st[N]; // 可能会有多棵树出现 需要标记下 哪些点未被搜索过
int res;
int sum[N];
void add(int a, int b)
{
    e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}

// 获取结点u的最长一条路径
int dfs(int u)
{
    st[u] = true;
    // dist: u节点的子节点中 最长的一条路径
    int dist = 0;
    int d1 = 0, d2 = 0;
    for (int i = h[u]; i != - 1; i = ne[i])
    {
        int j = e[i];
        if (!st[j])
        {
            int d = dfs(j);
            dist = max(d, dist);
            if (d > d1) d2 = d1, d1 = d;
            else if (d > d2) d2 = d;
        }
    }
    res = max(res, d1 + d2);
    // 返回时 需要加上u到子节点的距离
    return dist + 1;
}

int main()
{
    memset(h, -1, sizeof h);
    cin >> n;
    for (int i = 1; i <= n; i ++ )
        for (int j = 2; j <= n / i; j ++ )
            sum[i * j] += i;
    
    for (int i = 2; i <= n; i ++ )
        if (sum[i] < i)
            add(sum[i], i);
    
    for (int i = 1; i <= n; i ++ )
        if (!st[i])
            dfs(i);
    cout << res << endl;
    return 0;
}
